package com.heima.wemedia.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.common.constant.ArticleConstants;
import com.heima.file.service.impl.MinIOFileStorageService;
import com.heima.common.dtos.PageResponseResult;
import com.heima.common.dtos.ResponseResult;
import com.heima.common.enums.AppHttpCodeEnum;
import com.heima.utils.thread.WmThreadLocalUtil;
import com.heima.wemedia.dto.WmPageRequestDto;
import com.heima.wemedia.mapper.WmMaterialMapper;
import com.heima.wemedia.pojo.WmMaterial;
import com.heima.wemedia.pojo.WmUser;
import com.heima.wemedia.service.WmMaterialService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@Service
public class WmMaterialServiceImpl extends ServiceImpl<WmMaterialMapper, WmMaterial> implements WmMaterialService {

    @Autowired
    private MinIOFileStorageService minIOService;

    /**
     * 实现图片的上传至minio，并将路径写进数据库
     *
     * @param multipartFile
     * @return substring()：截取字符串中介于两个指定下标之间的字符
     * 2个参数截取中间元素，1个参数就是从当前截取到最后
     * lastIndexOf指最后一个"."的索引
     */
    @Override
    public ResponseResult upLoadPicture(MultipartFile multipartFile) {
        //System.out.println(multipartFile.getSize());

        //将路径定义出来，那么不在trycatch里也能使用
        String path = null;
        try {
            //1.检查参数
            if (multipartFile == null || multipartFile.getSize() == 0) {
                return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
            }

            //2.上传至minio
            //2.1重命名图片
            //随机生成uuid作为前缀，并将"-"字符取消
            String prefix = UUID.randomUUID().toString().replace("-", "");
            //截取当前图片的格式，比如：jpg，img等，originalFilename为图片上传的名字
            String originalFilename = multipartFile.getOriginalFilename();
            String format = originalFilename.substring(originalFilename.lastIndexOf("."));
            //拼接得到完整名称
            String picture = prefix + format;

            //2.2获取流
            InputStream inputStream = multipartFile.getInputStream();

            //上传至minio
            path = minIOService.uploadImgFile("", picture, inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //3. 将路径写进数据库，创建而不是修改
        //从进程中获取自媒体用户
        WmUser wmUser = WmThreadLocalUtil.getUser();
        WmMaterial wmMaterial = new WmMaterial();
        wmMaterial.setUserId(wmUser.getId());
        wmMaterial.setUrl(path);
        wmMaterial.setType(ArticleConstants.WMMATERIAL_TYPE_PICTURE);
        wmMaterial.setIsCollection(ArticleConstants.IS_NOT_COLLECTION);
        //获取当前时间，这个时间是英国时间
        wmMaterial.setCreatedTime(new Date());
        //存入一条数据
        save(wmMaterial);

        //4. 传回参数
        return ResponseResult.okResult(wmMaterial);
    }


    /**
     * 自媒体上传图片列表查看
     *
     * @param dto
     * @return
     */
    public ResponseResult photoList(WmPageRequestDto dto) {
        //1.校验参数，关于对分页的参数
        dto.checkParam();

        //2.做条件筛检
        //分页查询，创建一个分页构造器
        Page<WmMaterial> page = new Page<>(dto.getPage(), dto.getSize());

        LambdaQueryWrapper<WmMaterial> queryWrapper = new LambdaQueryWrapper<>();
        //是否收藏
        if (dto.getIsCollection() == ArticleConstants.IS_COLLECTION) {
            queryWrapper.eq(WmMaterial::getIsCollection, dto.getIsCollection());
        }

        //查询当前自媒体用户的图片
        Integer wmId = WmThreadLocalUtil.getUser().getId();
        queryWrapper.eq(WmMaterial::getUserId, wmId);

        //查询2023年之后的，将字符创类型转为date
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // String转Date
        String time = "2023-10-1 00:00:00";
        //将date定义出来
        Date date = null;
        try {
            date = format.parse(time);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        //查询2023年之后的，gt表示大于，lt表示小于
        queryWrapper.gt(WmMaterial::getCreatedTime, date);

        //按照时间创建倒序
        queryWrapper.orderByDesc(WmMaterial::getCreatedTime);

        //调用mp的分页方法，将分页构造器，条件构造器放进去，返回值就是查询得到的结果集
        page = page(page, queryWrapper);

        //构造返回参数，将结果返回，ResponseResult是PageResponseResult的父类
        ResponseResult responseResult = new PageResponseResult(dto.getPage(), dto.getSize(), (int) page.getTotal());
        responseResult.setData(page.getRecords());
        return responseResult;
    }

    /**
     * 图片收藏，图片id参数为路径变量
     * 更改is_collection为1，代表收藏
     * @param pid
     */
    public void photoCollect(Integer pid){
        //获取当前线程自媒体用户id
        Integer WmId = WmThreadLocalUtil.getUser().getId();
        //修改wm_material表里的is_collection字段
        LambdaUpdateWrapper<WmMaterial> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(WmMaterial::getUserId, WmId);
        updateWrapper.eq(WmMaterial::getId, pid);
        updateWrapper.set(WmMaterial::getIsCollection, ArticleConstants.IS_COLLECTION);
        update(updateWrapper);
    }

    /**
     * 图片取消收藏
     * 更改is_collection为0，代表取消收藏
     * @param pid
     */
    public void cancelCollect(Integer pid){
        //获取当前线程自媒体用户id
        Integer WmId = WmThreadLocalUtil.getUser().getId();
        //修改wm_material表里的is_collection字段
        LambdaUpdateWrapper<WmMaterial> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(WmMaterial::getUserId, WmId);
        updateWrapper.eq(WmMaterial::getId, pid);
        updateWrapper.set(WmMaterial::getIsCollection, ArticleConstants.IS_NOT_COLLECTION);
        update(updateWrapper);
    }

    /**
     * 删除图片，这里只是删除数据库中的地址
     * 并没有删除minio中实际的图片
     */
    public void delPhoto(Integer pid){
        //获取当前线程自媒体用户id
        Integer WmId = WmThreadLocalUtil.getUser().getId();
        //删除图片
        LambdaQueryWrapper<WmMaterial> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(WmMaterial::getUserId, WmId);
        queryWrapper.eq(WmMaterial::getId, pid);
        remove(queryWrapper);
    }

}
